package com.study.order.amqp;

import com.rabbitmq.client.Channel;
import com.study.order.entity.Order;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

@Slf4j
@Configuration
@RabbitListener(queues = {"order-queue"})
public class RabbitMqReceiveMessage {

    /**
     * @param message 原生消息详细信息:头+体
     * @param order   T<发送消息的类型>  Order order
     * @param channel 当前传输数据的通道
     *
     *   Queue 可以很多人来监听,只要收到消息,而且只能有一个收到此消息的场景：
     *    1.订单服务启动多个:同一个消息只有一个客户端可以收到
     *    2.只有下个消息完全处理完成,方法运行结束,我们就可以接收到下一个消息
     */
    @RabbitHandler
    public void receiveMessage(Message message, Order order, Channel channel) {
        log.info("接受到的消息:{}",order);
        byte[] body = message.getBody();
        //消息头属性信息
        MessageProperties messageProperties = message.getMessageProperties();
        //channel内按照顺序自增
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        log.info("通道内自增数为:{}",deliveryTag);
        //签收消息,非批量模式
        try {
            //签收消息
            channel.basicAck(deliveryTag,false);
            //拒收消息 requeue==false 丢弃 requeue==true 消息会再次发回服务器.重新入队
           //channel.basicNack(deliveryTag,false,false);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @RabbitHandler
    public void receiveMessage(Order order) {
        System.out.println("------------------------------------------------" + order);
    }

    @RabbitHandler
    public void receiveMessageString(String str) {
        System.out.println("------------------------------------------------" + str);
    }
}
